package com.msw.jcwapi.common.token;


import com.msw.jcwapi.common.Constants;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.UUID;
import java.util.concurrent.TimeUnit;


@Component
public class RedisTokenManager {
    @Resource
    private RedisTemplate redisTemplate;

    private Logger logger = LoggerFactory.getLogger(RedisTokenManager.class);

    /*
     生产新的token,微信用户用1来区分，管理员等用2来区分
     */
    public  String saveToken(Object object,int type) {
        //type指token类型，“user”表示用户token；“dev”表示设备token，andr表示移动端//并用加密。暂时没必要
        //如果是用户类型Id为userId,如果是设备类型Id为deviceId。
        //用UUID就足够了，token充当key,jsonObj存放用户的详细信息
        if (checkConnection()) {
            return null;
        }
        String token = UUID.randomUUID().toString().replace("-", "");
        String key = null;
        try {
            if(type==1){//微信用户
                key= Constants.AUTHORIZATION_WEIXIN + ":" + token;
                redisTemplate.boundValueOps(key).set(object, Constants.TOKEN_EXPIRES_WEIXIN, TimeUnit.HOURS);//威信用户
            }else{
                key=Constants.AUTHORIZATION_WEB + ":" + token;
                redisTemplate.boundValueOps(key).set(object, Constants.TOKEN_EXPIRES_WEB_MINITES, TimeUnit.MINUTES);//Web用户
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            logger.error("redis存储token异常");
            return null;
        }
        return token;
    }

    /*
覆盖以前的的token的value值，token保持不变
 */
//    public boolean rewriteToken( String token, Manager wxuser) {
//        // 格式："userid_tokenValue_typecode"
//        //type指token类型，“user”表示用户token；“dev”表示设备token，andr表示移动端//并用加密。暂时没必要
//        String key = Constants.AUTHORIZATION_WEIXIN + ":" + token;
//        try {
//
//            redisTemplate.boundValueOps(key).set(wxuser, Constants.TOKEN_EXPIRES_WEIXIN, TimeUnit.DAYS);//威信用户
//        } catch (Exception e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//            return false;
//        }
//        return true;
//    }

    /*
    根据token获取是微信用户，还是管理员用户，type为2为管理员
     */
    public  Object getUserByToken(String token,int type) {
        // TODO Auto-generated method stub
        //根据token从redis中查询用户信息，先验证是否合法
        if (StringUtils.isEmpty(token)) {
            return null;
        }
        String key=null;
        try {
            key=type==1?Constants.AUTHORIZATION_WEIXIN + ":" + token
                    :Constants.AUTHORIZATION_WEB + ":" + token;
            //先看有么有key,有就返回
            if (redisTemplate.hasKey(key)) {
                if(type==2) {//如果是web端进行访问
                    redisTemplate.boundValueOps(key).expire(Constants.TOKEN_EXPIRES_WEB_MINITES, TimeUnit.MINUTES);
                }
                return redisTemplate.boundValueOps(key).get();
            } else {
                return null;
            }

        } catch (Exception e) {
            logger.error("redis根据token:{}获取用户存在异常",key);
        }
        //返回null
        return null;
    }

    /*
     * 返回过期的时间
     * @see com.wlw.study.util.TokenManager#ttl(java.lang.String)
     */
//	public Long ttl(String token) {
//		// TODO Auto-generated method stub
//		return  redis.boundValueOps(token).getExpire();
//
//	}
    public  boolean checkConnection() {
        Boolean flag = null;
        try {
            RedisConnectionFactory redisConnectionFactory = redisTemplate.getConnectionFactory();
            RedisConnection redisConnection = redisConnectionFactory.getConnection();
            flag = redisConnection.isClosed();//false没有关闭
            return flag;
        } catch (Exception e) {
            logger.error("redis连接异常");
            return true;//直接返回 false
        }
    }

}
